factory method pattern implementation